#include "Secuenciacion.h"

/*********************************************************************
Muestra una traza de como están ordenadas las tareas.
Primero se muestra el tiempo inicial y el tiempo en el que terminará la tarea,
y a continuación, aparecen los datos de la tarea (tiempo, limite y penalizacion)
En caso de que vaya a haber penalizacion, mostramos una XXX
Esto lo utilizamos para confirmar que los algoritmos son correctos y nos 
dan lo esperado.
*********************************************************************/
void Secuenciacion::muestra_tareas(){
   printf("+++++++++++++++++++ TAREAS +++++++++++++++++ \n");
   int tiempo = 0;
   cout<<" T_INI | T_FIN\tDURAC.\tLIMITE\tPENALIZACION"<<endl;
   cout<<" -------------\t------\t------\t------------"<<endl;
   for (int i = 0; i < tareas.size();i++){
      cout<<"   "<<tiempo;
      tiempo+=tareas[i].duracion();
      cout<<"\t|   "<<tiempo;
      cout<<"\t   "<<tareas[i].duracion()<<"\t ";
      cout<<"   "<<tareas[i].limite()<<" \t";;
      cout<<"   "<<tareas[i].penalizacion();
      if (tareas[i].limite() < tiempo) {
         cout<<" XXX ";
      }
      cout<<endl;
   }
   cout<<endl<<endl;
}


/*********************************************************************
Lectura del fichero. Introduce los datos en un vector de Tareas
Ejemplo:
   3 //numero de tareas
   4 5 1  //4: duracion, 5: limite, 1: penalizacion
   1 5 3  //1: duracion, 5: limite, 3: penalizacion
   3 4 2  //3: duracion, 4: limite, 2: penalizacion
*********************************************************************/
void Secuenciacion::lectura_fich(string namefich){
   ifstream fs(string(namefich).c_str(),ios::in);

   int n_tareas;
   fs>>n_tareas;
   for (int i = 0; i < n_tareas;i++){
      int duracion,limite,penalizacion;
      fs>>duracion;
      fs>>limite;
      fs>>penalizacion;
      Tarea tarea(duracion,limite,penalizacion);
      tareas.push_back(tarea);
   }
}

/*********************************************************************
Heuristica. 
Procedimiento principal que realiza las distintas heuristicas.
Según el tipo (MENOR_LIMITE,MENOR_DURACION o MENOR_PENALIZACION) realizará
la ordenación correspondiente, y luego irá cogiendo las tareas en ese orden.
*********************************************************************/
void Secuenciacion::heuristica(int tipo){
  ordena(tipo); //depende del tipo de heuristica, hace la ordenacion necesaria
  int penalizaciones=0,tiempo=0;
  for (int i = 0; i < tareas.size();i++){
      tiempo += tareas[i].duracion();
      if (tiempo > tareas[i].limite()){ //si nos hemos pasado del limite...
         penalizaciones += tareas[i].penalizacion();
      }
   }
   cout<<"\n\n*** PENALIZACIONES: "<<penalizaciones<<endl;
}


/*********************************************************************
Ordena el vector "tareas", según los distintos parámetros de ellas
(de menor a mayor fecha límite, de menor a mayor duración o de menor
 a mayor penalizacion)
*********************************************************************/
void Secuenciacion::ordena (int tipo){
   Tarea aux;
   switch(tipo){
      case MENOR_LIMITE:
         for(int i=0;i<tareas.size()-1;i++) {
            for(int j=i+1;j<tareas.size();j++) {
               if (tareas[i].limite()>tareas[j].limite())
               {
                  aux=tareas[i];
                  tareas[i]=tareas[j];
                  tareas[j]=aux;
               }
            }
         }
         break;
      case MENOR_DURACION:
         for(int i=0;i<tareas.size()-1;i++) {
            for(int j=i+1;j<tareas.size();j++) {
               if (tareas[i].duracion()>tareas[j].duracion())
               {
                  aux=tareas[i];
                  tareas[i]=tareas[j];
                  tareas[j]=aux;
               }
            }
         }
         break;
      case MENOR_PENALIZACION:
         for(int i=0;i<tareas.size()-1;i++) {
            for(int j=i+1;j<tareas.size();j++) {
               if (tareas[i].penalizacion()<tareas[j].penalizacion())
               {
                  aux=tareas[i];
                  tareas[i]=tareas[j];
                  tareas[j]=aux;
               }
            }
         }
         break;
   }
}
